/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_discover.h
 * @brief Discover相关API
 */

#ifndef _NFA_DISCOVER_H_
#define _NFA_DISCOVER_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nfa_base.h"

#define NCI_RF_DISCOVER_POLL_A 0x01
#define NCI_RF_DISCOVER_POLL_B 0x02
#define NCI_RF_DISCOVER_POLL_F 0x04
#define NCI_RF_DISCOVER_POLL_V 0x08
#define NCI_RF_DISCOVER_POLL_ACTIVE 0x10

#define NCI_RF_DISCOVER_LISTEN_A 0x01
#define NCI_RF_DISCOVER_LISTEN_B 0x02
#define NCI_RF_DISCOVER_LISTEN_F 0x04
#define NCI_RF_DISCOVER_LISTEN_ACTIVE 0x10

#define NCI_RF_USER_DISCOVER_REVERT  -1
#define NCI_RF_USER_DISCOVER_NOT_SET -2

/**
 * @brief RF状态
 */
typedef enum {
    /** @brief 空闲状态，此时NFCC不会发射/响应场强，NFCC初始化后默认状态就是IDLE */
    NCI_RFST_IDLE = 0,
    /** @brief 发现状态，此状态下NFCC会周期性发射场强或监听卡模拟 */
    NCI_RFST_DISCOVERY,
    /** @brief 读取到多协议卡/多张卡后6103 NTF还未上报完成时的状态 */
    NCI_RFST_W4_ALL_DISCOVERIES,
    /** @brief 等待主机选择卡片协议状态 */
    NCI_RFST_W4_HOST_SELECT,
    /** @brief 读卡卡片激活状态 */
    NCI_RFST_POLL_ACTIVE,
    /** @brief 卡模拟激活状态 */
    NCI_RFST_LISTEN_ACTIVE,
    /** @brief 卡模拟休眠状态 */
    NCI_RFST_LISTEN_SLEEP,
    NCI_RFST_MAX,
} tNCI_RFST;

/**
 * @brief 获取当前的RF状态
 *
 * @return 当前RF状态
 */
tNCI_RFST nfa_rf_get_state();
/**
 * @brief 开启RF Discovery
 *
 * @param poll_tech_mask 需要开启的polling技术掩码
 * @param reader_mode 是否开启ReaderMode
 * @param restart 是否重启discovery，当RF Discovery已经开启时如果设置restart为false会直接返回NCI_STATUS_OK，反之会进入IDLE并重新启动discovery
 *
 * @return 成功开启Discovery返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_rf_enable_discovery(int poll_tech_mask, bool reader_mode, bool restart);
/**
 * @brief 开关POLLING功能
 *
 * @param is_start 是否开启POLLING，true为开启，false为关闭
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_rf_start_stop_polling(bool is_start);
/**
 * @brief 启动RF Discovery，并设置RF状态为NCI_RFST_DISCOVERY
 *
 * @note 只能在NCI_RFST_IDLE状态下调用
 * @note 调用成功后，RF状态会变为NCI_RFST_DISCOVERY
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_rf_start_discovery();
/**
 * @brief 停止RF Discovery，并回到NCI_RFST_IDLE状态
 *
 * @note 调用成功后，RF状态会变为NCI_RFST_IDLE
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_rf_stop_discovery();
/**
 * @brief 设置用户自定义的Discovery参数，此项目设置后，Discovery参数将完全以此值为准
 *
 * @note 此函数只能在IDLE和DISCOVERY状态下调用，其他状态调用会返回错误码
 *
 * @param poll_tech 用户自定义的POLLING技术, 不想设置时传NCI_RF_USER_DISCOVER_NOT_SET，取消设置时传NCI_RF_USER_DISCOVER_REVERT
 * @param listen_tech 用户自定义的LISTENING技术，不想设置时传NCI_RF_USER_DISCOVER_NOT_SET，取消设置时传NCI_RF_USER_DISCOVER_REVERT
 * @param restart_rf_discovery 是否重启RF Discovery
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_rf_set_user_discovery_tech(int poll_tech, int listen_tech, bool restart_rf_discovery);
/**
 * @brief 获取用户自定义的LISTEN技术
 *
 * @return 用户自定义的LISTEN技术
 */
int nfa_rf_get_user_listen_tech();
/**
 * @brief 设置用户自定义的POLLING技术
 *
 * @return 用户自定义的POLL技术
 */
int nfa_rf_get_user_poll_tech();

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // _NFA_DISCOVER_H_
